#include"calServer.hpp"
#include<memory>



//走到这里就是外部调用错误，没有传应该传的参数进来, 这里就提示一下
static void Usage(string proc)
{
    cout << "Usage: \n" << proc << "local_port\n";
}

// req,输入型参数，一定是一个完整的请求对象
// res，输出型参数，将请求根据业务逻辑处理后，将响应结果放到res， 也是一个对象
// 而cal函数不需要管理任何的序列化啊，反序列化之类的操作 
bool cal(const Request& req, Response& res) //截止到该函数，当前应用层已经分为了3层
{
    res._exitcode = 0;
    res._result = 0; //初始化，但是这里只是规范一下。其实在构造函数的时候就已经初始化完毕了

    switch(req._op)
    {
        case '+':
            res._result = req._x + req._y;
            break;
        case '-':
            res._result = req._x - req._y;
            break;
        case '*':
            res._result = req._x * req._y;
            break;
        case '/':
            if(req._y == 0)
                res._exitcode = DIV_ZERO; //除0错误
            else
                res._result = req._x / req._y;
            break;
        case '%':
            if(req._y == 0)
                res._exitcode = MOD_ZERO;
            else
                res._result = req._x % req._y;
            break;
        default:
            res._exitcode = OP_ERR;
            break;
    }

    return true;
}

//和之前udp的server进程调用一样，要穿port
// ./tcpServer port
int main(int argc, char* argv[])
{
    if(argc != 2) //必须得是2个元素，进程名，port。【这是命令行参数的知识，忘了就复习】
    {
        Usage(argv[0]);
        exit(USAGE_ERR);
    }
    // 将argv中char*类型的port记载下来
    uint16_t port = atoi(argv[1]); //必须转成int类型，因为argv里面全是char*类型的元素
    
    unique_ptr<tcpServer> ts(new tcpServer(port));
    ts->InitServer();  //初始化服务器
    ts->Start(cal); //然后再启动服务器, 这里要将任务传给服务器

    return 0;
}
